home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / libs / unixlib.lha / unix / src / lstat.c < prev    next >
C/C++ Source or Header  |  1996-11-10  |  1KB  |  54 lines

  1. #include "amiga.h"
  2. #include <dos/dosextens.h>
  3. #include <sys/stat.h>
  4. #include <time.h>
  5. #include <string.h>
  6.  
  7. typedef struct DevProc        DevProc;
  8.  
  9. int
  10. readlink(const char *path, char *name, int max)
  11. {
  12.     int r = -1;
  13.     DevProc *dp = NULL;
  14.     DevProc *dp2;
  15.     short failsafe = 20;
  16.  
  17.     __chkabort();
  18.     while (dp2 = GetDeviceProc(path, dp)) {
  19.     dp = dp2;
  20.     if (ReadLink(dp->dvp_Port, dp->dvp_Lock, path, name, max)) {
  21.         r = strlen(name);
  22.         break;
  23.     }
  24.     if (--failsafe == 0)
  25.         break;
  26.     if ((dp->dvp_Flags & DVPF_ASSIGN) == 0)
  27.         break;
  28.     }
  29.     FreeDeviceProc(dp);
  30.     return(r);
  31. }
  32.  
  33. int
  34. lstat(const char *name, struct stat *sbuf)
  35. {
  36.     char buf[256];
  37.  
  38.     __chkabort();
  39.     if (readlink(name, buf, sizeof(buf)) >= 0) {
  40.     memset(sbuf, 0, sizeof(*sbuf));
  41.     sbuf->st_dev = (long) DeviceProc((UBYTE *)name);
  42.     sbuf->st_nlink = 1;
  43.     sbuf->st_uid = AMIGA_UID;
  44.     sbuf->st_gid = AMIGA_GID;
  45.     sbuf->st_blksize = 512;
  46.     sbuf->st_mode = S_IFLNK | S_IREAD | S_IWRITE;
  47.     /* 1-Jan-1978 */
  48.     sbuf->st_ctime = sbuf->st_atime = sbuf->st_mtime = 252460800;
  49.     return(0);
  50.     } else {
  51.     return(stat(name, sbuf));
  52.     }
  53. }
  54.